﻿#include "study08.h"

// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170
bool working_flag = true;
using namespace std; // 标准库命名空间声明
using namespace std::chrono_literals; // 时间精度命名空间声明

struct CountTime {
    std::chrono::steady_clock::time_point start_time, end_time;
    std::chrono::duration<float, std::milli> duration_float; // 计算时间差，使用精度为微秒
    // duration<float>默认单位为秒，这里使用 std::milli 设置单位为毫秒 std::micro 为微秒
//std::chrono::microseconds duration;  // 计算时间差，精度为微秒，用一个就行

    CountTime()
        : duration_float(std::chrono::duration<float, std::micro>(0)) // 初始化时间差为0
    {
        start_time = std::chrono::steady_clock::now();
    } // 记录开始时间，精度为纳秒

    ~CountTime() {
        end_time = std::chrono::steady_clock::now(); // 记录结束时间
        //duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
        duration_float = end_time - start_time;
        // 计算时间差，这里单位为毫秒，精度为微秒
    //cout << "test_time 函数运行时间：" << duration.count() << "微秒" << endl; // 输出时间差，精度为微秒
        cout << "test_time 函数运行时间：" << duration_float.count() << "毫秒" << endl;
    }
};

static void working_thread(size_t id = 0) { // 支持默认值参数
    cout << "the working thread for working_thread function is: " << this_thread::get_id() << endl;
    // 线程工作代码
    //std::this_thread::sleep_for(std::chrono::milliseconds(id * 100));
    while (working_flag) {
        cout << "working... " << id++ << endl;
        std::this_thread::sleep_for(1s); // 休眠1秒，需要 using namespace std::chrono_literals;
    }

    std::cout << "线程 " << id << " 工作完成！" << "退出程序" << std::endl;
}

void test_thread() {
    thread t1(working_thread, 1); // 创建线程
    cin.get(); // 等待用户输入

    working_flag = false; // 线程工作完成条件
    t1.join(); // 线程加入，等待线程结束，表示在当前线程上阻塞，直到线程 t1 结束

    cout << "the test thread for test_thread_time function is: " << this_thread::get_id() << endl;
}

void test_time() {
    CountTime count_time; // 计时器
    // 线程工作代码
    //std::this_thread::sleep_for(std::chrono::milliseconds(id * 100));
    for (int i = 0; i < 10; ) {
        cout << "working..." << ++i << "\n";
    }
}